home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_503 / pcq / pcq12asc.lzh / Runtime / PCQ / sqrt.asm < prev    next >
Assembly Source File  |  1990-12-10  |  2KB  |  64 lines

  1. *
  2. *    Sqrt.asm (of PCQ Pascal)
  3. *    Copyright 1990 Patrick Quaid
  4. *
  5. *    This routine just implements the sqrt function using
  6. *    Newton's method.  As I recall, this routine will in
  7. *    some cases diverge, but it seems to work reasonably
  8. *    well.  It figures the square root to 5 or 6 digits,
  9. *    which in this implementation requires between, say,
  10. *    6 and 12 iterations (for 100 and 200000, respectively).
  11. *
  12.  
  13.     SECTION    PCQ_Runtime,CODE
  14.  
  15.     XREF    _p%MathBase
  16.  
  17.     XREF    _LVOSPDiv
  18.     XREF    _LVOSPMul
  19.     XREF    _LVOSPCmp
  20.     XREF    _LVOSPAdd
  21.     XREF    _LVOSPSub
  22.     XREF    _LVOSPAbs
  23.  
  24.     XDEF    _p%sqrt
  25. _p%sqrt
  26.     move.l    4(sp),d0        ; d0 := x
  27.     move.l    #$80000042,d1        ; d1 := 2.0
  28.     move.l    _p%MathBase,a6
  29.     jsr    _LVOSPDiv(a6)        ; d0 := x / 2.0
  30.     move.l    d0,-(sp)        ; save approx on the stack
  31.  
  32.     move.l    8(sp),d0        ; d0 := x
  33.     move.l    #$C3500051,d1        ; d1 := 100000.0
  34.     jsr    _LVOSPDiv(a6)        ; d0 := x / 100000.0
  35.     move.l    d0,-(sp)        ; save epsilon on the stack
  36.  
  37. ComputeError:
  38.     move.l    4(sp),d0        ; get approx
  39.     move.l    d0,d1            ; move to d1
  40.     jsr    _LVOSPMul(a6)        ; d0 := Sqr(approx)
  41.     move.l    d0,d1            ; d1 := Sqr(approx)
  42.     move.l    12(sp),d1        ; d0 := x
  43.     jsr    _LVOSPSub(a6)        ; d0 := x - Sqr...
  44.     jsr    _LVOSPAbs(a6)        ; d0 := abs(x - sqr())
  45.     move.l    (sp),d1            ; d1 := epsilon
  46.     jsr    _LVOSPCmp(a6)
  47.     ble.s    ReturnApprox        ; if error <= epsilon, leave
  48.  
  49.     move.l    12(sp),d0        ; d0 := x
  50.     move.l    4(sp),d1        ; d1 := approx
  51.     jsr    _LVOSPDiv(a6)        ; d0 := x / approx
  52.     move.l    4(sp),d1        ; d1 := approx
  53.     jsr    _LVOSPAdd(a6)        ; d0 := approx + x / approx
  54.     move.l    #$80000042,d1        ; d1 := 2.0
  55.     jsr    _LVOSPDiv(a6)        ; d0 := (approx + x/approx)/2
  56.     move.l    d0,4(sp)        ; approx := d0
  57.     bra    ComputeError        ; iterate
  58. ReturnApprox
  59.     move.l    4(sp),d0        ; d0 := approx
  60.     addq.l    #8,sp            ; pop stack
  61.     rts
  62.  
  63.     END
  64.